package designpattern;


/**
 * 适配器模式实现
 * 1. 简介
 * 作为两个不兼容德接口之间德桥梁。它结合了两个独立接口德功能
 * 例子：内存卡和读卡器和电脑（读卡器作为适配器）
 * 主要解决: 将先存德对象加入新的环境中。而新环境德接口不支持现对象
 * 何时使用：
 * (1) 系统需要使用现有的类，而此类的接口不符合系统的需要
 * (2) 想要建立一个可以重复使用的类，用于与一些彼此之间没有太大关联的一些类
 * (3) 通过接口转换，将一个类插入另一个类中
 * 2. 优点
 * (1) 可以让两个没有关联的类一起运行
 * (2) 提高了类的复用
 * (3) 更加灵活
 * 3. 缺点
 * (1) 过多的使用适配器会让系统变得更加复杂
 * (2) 至多一个适配类，而且目标类必须是抽象类
 * 4. 注意
 * 5. 实现步骤
 * // 1. 创建简单接口和复杂接口
 * // 2. 创建接口的实现类
 * // 3. 创建适配器
 * // 4. 创建构造适配器实现类
 */
public class AdapterTest {
    public static void main(String[] args) {
        AudioPlayrt audioPlayrt = new AudioPlayrt();
        audioPlayrt.play("mp4", "123");
        audioPlayrt.play("vlc", "123vlc");
        audioPlayrt.play("aaa", "123vlc");
    }
}

// 1. 创建一个简单接口（目标类）
interface MediaPlayer {
    void play(String audioType, String fileName);
}

// 1. 创建另一个功能丰富接口
interface AdvancedMediaPlayer {
    void playVlc(String fileName);

    void playMp4(String fileName);
}

// 2. 创建接口德实现类
class VlcPlayer implements AdvancedMediaPlayer {

    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {

    }
}

class Mp4Player implements AdvancedMediaPlayer {

    @Override
    public void playVlc(String fileName) {
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}

// 3. 创建接口适配器
class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMediaPlayer;

    // 构建一个构造器
    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer = new VlcPlayer();
        } else {
            advancedMediaPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer.playVlc(fileName);
        } else {
            advancedMediaPlayer.playMp4(fileName);
        }
    }
}

// 4. 构造适配器
class AudioPlayrt implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        } else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}

